/**
 * @file CommandParser.cpp
 * @brief 命令解析器的实现，继承OpenCV中的CommandLineParser类，
 *        在其基础上拓展，可解析：
 *        "help" -- 打印帮助信息
 *        "time" -- 设置计时器计算帧率
 *        "show" -- 绘制Bounding Box并显示窗口
 * @author Rosen (1018477962@qq.com)
 * @version 1.0
 * @date 2021-09-26
 * 
 * @copyright Copyright (c) 2021 by Rosen.
 */
#include "CommandParser.h"

/**
 * @brief 输入"-help"，打印帮助信息
 */
void CommandParser::if_PrintHelp()
{
    // 如果接收到"-help"，打印帮助信息
    if (this->has("help"))
    {
        this->printMessage();
        system("exit");
    }
}

/**
 * @brief 输入"-show"，显示图像
 * @param img 显示的image
 */
bool CommandParser::if_Show(const cv::Mat &img)
{
    if (this->get<bool>("show"))
    {
        cv::namedWindow("Graph"+std::to_string(img.type()), cv::WINDOW_NORMAL);
        cv::resizeWindow("Graph"+std::to_string(img.type()), img.size().width, img.size().height);
        cv::imshow("Graph"+std::to_string(img.type()), img);

        if (cv::waitKey(1) == 27)
            if (cv::waitKey(0) == 27)
                exit(0);
        return true;
    }
    return false;
}

void CommandParser::if_Output(Strategy s, void(Strategy::*ptr_fun)())
{
    if(this->get<bool>("output"))
    {
        (s.*ptr_fun)();
    }
}

/**
 * @brief 设置计时器，设定同时开始计时
 */
void CommandParser::if_Set_Counter()
{
    if (this->get<bool>("time"))
        // 获取开始执行时间
        this->_startTime = static_cast<double>(cv::getTickCount());
}

/**
 * @brief 输入"-time"，计算运行时间
 */
void CommandParser::if_CountingFPS()
{
    if (this->get<bool>("time"))
    {
        int FPS;
        float endtime, IntervalTime;
        endtime = static_cast<double>(cv::getTickCount());
        IntervalTime = (endtime - _startTime) / cv::getTickFrequency() * 1000;
        FPS = 1e+03 / IntervalTime;
        std::cout << "运行时间：\t" << IntervalTime << std::endl;
        std::cout << "运行帧率：\t" << FPS << " FPS" << std::endl;
    }
}
